package main

import "fmt"

type Point struct {
	x, y int
}

// 返回某个属性的方法，geteer
// 一个属性 x 只提供了 getter 方法，只读属性
func (p Point) Getx() int {
	fmt.Printf("%+v, %p\n", p, &p)
	return p.x
}

// setter 传参，无返回值
func (p Point) SetX(value int) {
	p.x = value
}

func (p *Point) GetY() int {
	fmt.Printf("%+v %p\n", p, p)
	return p.y
}

func (p *Point) SetY(value int) {
	fmt.Printf("%+v, %p\n", p, p)
	p.y = value
}

func (*Point) foo() {
	fmt.Println("我是一个说明函数")
}

func main() {
	p1 := Point{4, 5}
	fmt.Printf("p1 %T %[1]v %p, %d:%d\n", p1, &p1, p1.x, p1.y)

	p1.SetY(35)
	fmt.Printf("p1 %T %[1]v %p, %d:%d\n", p1, &p1, p1.x, p1.y)

	p2 := &p1
	p2.SetY(123)
	fmt.Printf("p1 %T %[1]v %p, %d:%d\n", p1, &p1, p1.x, p1.y)

	// p1.SetX(100)
	// fmt.Printf("p1 %T %[1]v %p, %d:%d\n", p1, &p1, p1.x, p1.y)
	// p2 := &p1
	// p2.SetX(200)
	// fmt.Printf("p1 %T %[1]v %p, %d:%d\n", p1, &p1, p1.x, p1.y)

	// p2 := &p1
	// fmt.Println(p1.x, p1.Getx())
	// fmt.Println(p2.x, p2.Getx())
	// fmt.Println("~~~~~~~~~~~~~~~~~~~~~~~~~~")
	// fmt.Println(p1.y, p2.y)
	// fmt.Println("--------------------------")
	// fmt.Println(p1.GetY())
	// fmt.Println(p2.GetY())

}
